package com.ruoyi.system.service.impl;

import com.ruoyi.common.core.text.Convert;
import com.ruoyi.system.domain.Dept;
import com.ruoyi.system.domain.JingfeiTuikuan;
import com.ruoyi.system.domain.JingfeiYue;
import com.ruoyi.system.mapper.DeptMapper;
import com.ruoyi.system.mapper.JingfeiTuikuanMapper;
import com.ruoyi.system.mapper.JingfeiYueMapper;
import com.ruoyi.system.service.IDeptidOlddeptidService;
import com.ruoyi.system.service.IJingfeiTuikuanService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * 退款Service业务层处理
 * 
 * @author ruoyi
 * @date 2023-04-13
 */
@Service
public class JingfeiTuikuanServiceImpl implements IJingfeiTuikuanService 
{
    @Autowired
    private JingfeiTuikuanMapper jingfeiTuikuanMapper;

    @Autowired
    private JingfeiYueMapper jingfeiYueMapper;

    @Autowired
    private DeptMapper deptMapper;

    @Autowired
    private IDeptidOlddeptidService deptidOlddeptidService;
    /**
     * 查询退款
     * 
     * @param id 退款主键
     * @return 退款
     */
    @Override
    public JingfeiTuikuan selectJingfeiTuikuanById(String id)
    {
        return jingfeiTuikuanMapper.selectJingfeiTuikuanById(id);
    }

    /**
     * 查询退款列表
     * 
     * @param jingfeiTuikuan 退款
     * @return 退款
     */
    @Override
    public List<JingfeiTuikuan> selectJingfeiTuikuanList(JingfeiTuikuan jingfeiTuikuan)
    {
        return jingfeiTuikuanMapper.selectJingfeiTuikuanList(jingfeiTuikuan);
    }

    /**
     * 新增退款
     * 
     * @param jingfeiTuikuan 退款
     * @return 结果
     */
    @Override
    public int insertJingfeiTuikuan(JingfeiTuikuan jingfeiTuikuan)
    {
        return jingfeiTuikuanMapper.insertJingfeiTuikuan(jingfeiTuikuan);
    }

    /**
     * 修改退款
     * 
     * @param jingfeiTuikuan 退款
     * @return 结果
     */
    @Override
    public int updateJingfeiTuikuan(JingfeiTuikuan jingfeiTuikuan)
    {
        return jingfeiTuikuanMapper.updateJingfeiTuikuan(jingfeiTuikuan);
    }

    /**
     * 批量删除退款
     * 
     * @param ids 需要删除的退款主键
     * @return 结果
     */
    @Override
    public int deleteJingfeiTuikuanByIds(String ids)
    {
        return jingfeiTuikuanMapper.deleteJingfeiTuikuanByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除退款信息
     * 
     * @param id 退款主键
     * @return 结果
     */
    @Override
    public int deleteJingfeiTuikuanById(String id)
    {
        return jingfeiTuikuanMapper.deleteJingfeiTuikuanById(id);
    }

    /**
     * 制定退款计划
     * @param deptId 单位ID
     * @param zhiliu 滞留余额
     * @param daifa 待发余额
     * @param tuikuanyuanyin 退款原因
     * @return
     */
    @Override
    @Transactional
    public int zhidingTuikuanJihua(String deptId, double zhiliu, double daifa, String tuikuanyuanyin) {
        Dept dept = deptMapper.selectDeptById(deptidOlddeptidService.DeptIdToOldDeptId(deptId));
        String tuigeiDeptId = deptidOlddeptidService.OldDeptIdToDeptId(dept.getParentid());
        JingfeiYue jingfeiYue = jingfeiYueMapper.selectJingfeiYueByDeptid(deptId);
        JingfeiTuikuan jingfeiTuikuan = new JingfeiTuikuan();
        jingfeiTuikuan.setId(UUID.randomUUID().toString());
        jingfeiTuikuan.setDeptid(deptId);
        jingfeiTuikuan.setDaifa(daifa);
        jingfeiTuikuan.setZhiliu(zhiliu);
        jingfeiTuikuan.setZongjine(daifa + zhiliu);
        jingfeiTuikuan.setTuituanyuanyin(tuikuanyuanyin);
        jingfeiTuikuan.setTuikuanshijian(new Date());
        jingfeiTuikuan.setIsshoudao(0);
        jingfeiTuikuan.setBeizhu1(tuigeiDeptId);
        jingfeiTuikuan.setBeizhu2(dept.getJigoumingcheng());
        jingfeiYue.setYue(jingfeiYue.getYue() - zhiliu - daifa);
        jingfeiYue.setZhiliu(0.0);
        jingfeiYue.setDaifa(jingfeiYue.getDaifa() - daifa);
        if (jingfeiYueMapper.updateJingfeiYue(jingfeiYue) != 1
                || jingfeiTuikuanMapper.insertJingfeiTuikuan(jingfeiTuikuan) != 1)
            throw new RuntimeException("制定退款计划失败" + deptId);
        return 1;
    }

    /**
     * @param ppDeptId
     * @param ppPageIndex
     * @param ppPageSize
     * @return
     */
    @Override
    public List<JingfeiTuikuan> selectTuikuanList(String ppDeptId, int ppPageIndex, int ppPageSize) {
        int mmStartIndex = (ppPageIndex - 1) * ppPageSize;
        return jingfeiTuikuanMapper.selectTuikuanList(ppDeptId,mmStartIndex,ppPageSize);
    }

    /**
     * @param ppDeptId
     * @return
     */
    @Override
    public int countTuikuanList(String ppDeptId) {
        return jingfeiTuikuanMapper.countTuikuanList(ppDeptId);
    }


    public int countChildDeptNameAndAllByDeptId(String deptId, String deptName, int status){
        return jingfeiTuikuanMapper.countChildDeptNameAndAllByDeptId(deptId, deptName, status);
    }
    /**
     * 查询下属单位的退款列表
     *
     * @param deptId 单位ID
     * @return 返回单位名称 + jingfeituikuan所有字段
     */
    @Override
    public List<Map<String, Object>> findTuikuanList(String deptId, String deptName, int status, int pageIndex,
                                                     int pageSize) {
        int startIndex = (pageIndex - 1) * pageSize;
        return jingfeiTuikuanMapper.selectChildDeptNameAndAllByDeptId(deptId, deptName, status, startIndex, pageSize);

    }

    @Override
    @Transactional
    public int querenTuikuan(String deptId, String ids) {

        String[] tuikuanIds = ids.split(",");
        JingfeiYue jingfeiYue = jingfeiYueMapper.selectJingfeiYueByDeptid(deptId);
        JingfeiTuikuan jingfeiTuikuan = null;
        for (String tuikuanId : tuikuanIds) {
            jingfeiTuikuan = jingfeiTuikuanMapper.selectJingfeiTuikuanById(tuikuanId);
            jingfeiYue.setYue(jingfeiYue.getYue() + jingfeiTuikuan.getZongjine());
            jingfeiYue.setDaifa(jingfeiYue.getDaifa() + jingfeiTuikuan.getDaifa());
            jingfeiYue.setZhiliu(jingfeiYue.getZhiliu() + jingfeiTuikuan.getZhiliu());
        }
        if (jingfeiTuikuanMapper.updateIsshoudaoByIds(tuikuanIds) != tuikuanIds.length
                || jingfeiYueMapper.updateJingfeiYue(jingfeiYue) != 1)
            throw new RuntimeException("确认收款失败" + ids);
        return 1;
    }
}
